home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Tools / pynche / Main.py < prev    next >
Encoding:
Python Source  |  2000-06-23  |  5.6 KB  |  212 lines

  1. """Pynche -- The PYthon Natural Color and Hue Editor.
  2.  
  3. Contact: Barry Warsaw
  4. Email:   bwarsaw@python.org
  5. Version: %(__version__)s
  6.  
  7. Pynche is based largely on a similar color editor I wrote years ago for the
  8. Sunview window system.  That editor was called ICE: the Interactive Color
  9. Editor.  I'd always wanted to port the editor to X but didn't feel like
  10. hacking X and C code to do it.  Fast forward many years, to where Python +
  11. Tkinter provides such a nice programming environment, with enough power, that
  12. I finally buckled down and implemented it.  I changed the name because these
  13. days, too many other systems have the acronym `ICE'.
  14.  
  15. This program currently requires Python 1.5 with Tkinter.  It has only been
  16. tested on Solaris 2.6.  Feedback is greatly appreciated.  Send email to
  17. bwarsaw@python.org
  18.  
  19. Usage: %(PROGRAM)s [-d file] [-i file] [-X] [-v] [-h] [initialcolor]
  20.  
  21. Where:
  22.     --database file
  23.     -d file
  24.         Alternate location of a color database file
  25.  
  26.     --initfile file
  27.     -i file
  28.         Alternate location of the initialization file.  This file contains a
  29.         persistent database of the current Pynche options and color.  This
  30.         means that Pynche restores its option settings and current color when
  31.         it restarts, using this file (unless the -X option is used).  The
  32.         default is ~/.pynche
  33.  
  34.     --ignore
  35.     -X
  36.         Ignore the initialization file when starting up.  Pynche will still
  37.         write the current option settings to this file when it quits.
  38.  
  39.     --version
  40.     -v
  41.         print the version number
  42.  
  43.     --help
  44.     -h
  45.         print this message
  46.  
  47.     initialcolor
  48.         initial color, as a color name or #RRGGBB format
  49.  
  50. """
  51.  
  52. __version__ = '0.1'
  53.  
  54. import sys
  55. import os
  56. import string
  57. import getopt
  58. import ColorDB
  59. from PyncheWidget import PyncheWidget
  60. from Switchboard import Switchboard
  61. from StripViewer import StripViewer
  62. from ChipViewer import ChipViewer
  63. from TypeinViewer import TypeinViewer
  64.  
  65.  
  66.  
  67. PROGRAM = sys.argv[0]
  68.  
  69. # Default locations of rgb.txt or other textual color database
  70. RGB_TXT = [
  71.     # Solaris OpenWindows
  72.     '/usr/openwin/lib/rgb.txt',
  73.     # The X11R6.4 rgb.txt file
  74.     os.path.join(sys.path[0], 'X/rgb.txt'),
  75.     # add more here
  76.     ]
  77.  
  78.  
  79.  
  80. def docstring():
  81.     return string.rstrip(__doc__ % globals())
  82.  
  83.  
  84. def usage(status, msg=''):
  85.     print docstring()
  86.     if msg:
  87.         print msg
  88.     sys.exit(status)
  89.  
  90.  
  91.  
  92. def initial_color(s, colordb):
  93.     # function called on every color
  94.     def scan_color(s, colordb=colordb):
  95.         try:
  96.             r, g, b = colordb.find_byname(s)
  97.         except ColorDB.BadColor:
  98.             try:
  99.                 r, g, b = ColorDB.rrggbb_to_triplet(s)
  100.             except ColorDB.BadColor:
  101.                 return None, None, None
  102.         return r, g, b
  103.     #
  104.     # First try the passed in color
  105.     r, g, b = scan_color(s)
  106.     if r is None:
  107.         # try the same color with '#' prepended, since some shells require
  108.         # this to be escaped, which is a pain
  109.         r, g, b = scan_color('#' + s)
  110.     if r is None:
  111.         print 'Bad initial color, using gray50:', s
  112.         r, g, b = scan_color('gray50')
  113.     if r is None:
  114.         usage(1, 'Cannot find an initial color to use')
  115.         # does not return
  116.     return r, g, b
  117.  
  118.  
  119.  
  120. def build(master=None, initialcolor=None, initfile=None, ignore=None):
  121.     # create the windows and go
  122.     for f in RGB_TXT:
  123.     try:
  124.         colordb = ColorDB.get_colordb(f)
  125.             if colordb:
  126.                 break
  127.     except IOError:
  128.         pass
  129.     else:
  130.         usage(1, 'No color database file found, see the -d option.')
  131.  
  132.     # create all output widgets
  133.     s = Switchboard(colordb, not ignore and initfile)
  134.  
  135.     # create the application window decorations
  136.     app = PyncheWidget(__version__, s, master=master)
  137.     w = app.window()
  138.  
  139.     s.add_view(StripViewer(s, w))
  140.     s.add_view(ChipViewer(s, w))
  141.     s.add_view(TypeinViewer(s, w))
  142.  
  143.     # get the initial color as components and set the color on all views.  if
  144.     # there was no initial color given on the command line, use the one that's 
  145.     # stored in the option database
  146.     if initialcolor is None:
  147.         optiondb = s.optiondb()
  148.         red = optiondb.get('RED')
  149.         green = optiondb.get('GREEN')
  150.         blue = optiondb.get('BLUE')
  151.         # but if there wasn't any stored in the database, use grey50
  152.         if red is None or blue is None or green is None:
  153.             red, green, blue = initial_color('grey50', colordb)
  154.     else:
  155.         red, green, blue = initial_color(initialcolor, colordb)
  156.     s.update_views(red, green, blue)
  157.     return app, s
  158.  
  159.  
  160. def run(app, s):
  161.     try:
  162.     app.start()
  163.     except KeyboardInterrupt:
  164.     pass
  165.  
  166.  
  167.  
  168. def main():
  169.     try:
  170.     opts, args = getopt.getopt(
  171.             sys.argv[1:],
  172.             'hd:i:Xv',
  173.             ['database=', 'initfile=', 'ignore', 'help', 'version'])
  174.     except getopt.error, msg:
  175.     usage(1, msg)
  176.  
  177.     if len(args) == 0:
  178.         initialcolor = None
  179.     elif len(args) == 1:
  180.         initialcolor = args[0]
  181.     else:
  182.     usage(1)
  183.  
  184.     ignore = 0
  185.     initfile = os.path.expanduser('~/.pynche')
  186.     for opt, arg in opts:
  187.     if opt in ('-h', '--help'):
  188.         usage(0)
  189.         elif opt in ('-v', '--version'):
  190.             print '''\
  191. Pynche -- The PYthon Natural Color and Hue Editor.
  192. Contact: Barry Warsaw
  193. Email:   bwarsaw@python.org
  194. Version: %s''' % __version__
  195.             sys.exit(0)
  196.     elif opt in ('-d', '--database'):
  197.         RGB_TXT.insert(0, arg)
  198.         elif opt in ('-X', '--ignore'):
  199.             ignore = 1
  200.         elif opt in ('-i', '--initfile'):
  201.             initfile = arg
  202.  
  203.     app, sb = build(initialcolor=initialcolor,
  204.                     initfile=initfile,
  205.                     ignore=ignore)
  206.     run(app, sb)
  207.     sb.save_views()
  208.  
  209.  
  210. if __name__ == '__main__':
  211.     main()
  212.